Repository navigation
[0.9.0] Season seats: set_aside_season_block, retrieve_season_block, release_season_block, inventoryMode - #14
Merged
Merged
Conversation
…l 56 webhook names, events series_key
…he p2a-api review
…tle (2.16c) createEventSeries takes fromEventKey: an event already set up becomes the first date under its own key and every other date is a copy of it; name and chartKey are then left out. Every date of a series carries the series' plain name. Matches seatmap slice 2.16c.
Adds releaseSeasonLapsedOffers (POST /v1/seasons/{key}/renewal-offers/release-lapsed, no body, header replay, 202 with the job). retrieveSeasonHostedRenewals pages with cursor and limit (1-500) and answers nextCursor, and listSeasonRenewalOffers pages the same way (1-100). createSeasonRenewalOffers answers 201 {offers} for 100 contracts or fewer and 202 {job, batchId} above that. The bring-across (createSeasonHolderImportFromSeason) answers 202 with a holder_import job above 100 holders. Renewal emails take up to 20,000 offer ids; above that, 422 too_many_offer_ids.
…e_abandoned (p2b) The public API changes in p2b (b88ed794e..ee7df2921): SeatLayer::Seasons.date_cancel_void_job_id names the date_cancel_void job a date cancel starts (sbj_void_<amendmentId>, followed with retrieve_season_bulk_job; season.ticket.voided says date_cancelled); SeatLayer::Seasons.holder_import_rows_per_call sizes a create_season_holder_import call by its dates (a package now holds 2 to 50; a call over it raises ValidationError invalid_rows with maxRows); update_season's singleTicketDates may carry jobRefused, and an exact retry is not applied twice; create_event_series documents 409 create_abandoned.
…b audit) updateEventSeries sends only the prices that change: each date keeps its own price for every category or tier left out. A season's null transfer or return cut-off means the club default from Settings > Ticket site, or until the date starts when the club has none. Holder transfers and returns through the secret key are not stopped by the club's customer switches; cut-offs still apply.
…part C) A date its season cancelled never opens again: moving its sales to testable or live, or reopening it, answers 409 season_date_cancelled, and an event series "sales on" leaves it closed as a failed item of the job (season_date_cancelled; not in failedDates). A cancelled date can't be moved, postponed, replaced or marked as taken place: 409 performance_cancelled.
pietechsolution
force-pushed
the
navin/season-block-0.10.0
branch
2 times, most recently
from
November 10, 2026 02:34
423e034 to
da9f1ae
Compare
…release_season_block; season.block.ready/released webhook names; Seasons.date_leave_pending? for the 202 date-leave answer. No version bump: publish only once the phase 4 API is on production
pietechsolution
force-pushed
the
navin/season-block-0.10.0
branch
from
November 10, 2026 05:48
da9f1ae to
a679d2e
Compare
Merged
pietechsolution
marked this pull request as ready for review
November 11, 2026 10:14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Season seats for the
seatlayergem, part of the 0.9.0 release. One release, 0.9.0, carries season 2a (#13) and this PR (decided 10 Nov).season-2a-serverso it builds on the season-2a methods. Its name still says 0.10.0, from before the decision: renaming a head branch would close the PR.SeatLayer::VERSIONis untouched.What it adds
Built to
docs/season-block-2026-11-08/contract.mdin the app repo (§2, §5, §6, and §8 "Amendments, 9 Nov"). Method names are the operationIds, snake_cased.Methods:
seasons.set_aside_season_block(season_key, expected_revision:, keep_for_single_tickets: nil, idempotency_key: nil);seasons.retrieve_season_block(season_key);seasons.release_season_block(season_key, expected_revision:, scope:, event_keys: nil, at: nil, reason: nil, idempotency_key: nil).Both writes use the
:header_replayretry policy, so an Idempotency-Key is generated when none is given, as onrefund_season_performance. Each write answers "job" and "block"; follow the job withretrieve_season_bulk_job.inventory_mode:("block"|"per_hold") oncreate_seasonandupdate_season, sent as"inventoryMode"only when given."block"opts the season into season seats; the default staysper_hold. Every Season answer carries"inventoryMode".Webhook names:
Webhooks::EVENT_NAMESaddsseason.block.readyandseason.block.released, in the API's order (56 → 58).createandupdatecheck names against this list and raiseArgumentErrorfor any other. Without this, 0.9.0 would refuse the two new names; 0.8.0 refuses them.The 202 while a date leaves every season seat (
create_season_amendmentcancel,mark_season_performance_past):SeatLayer::Seasons.date_leave_pending?(answer). The return values are unchanged.Errors: no new classes or constants. The new codes come through
SeatLayer::APIErrorand its subclasses withcode(§8 item 4). The CHANGELOG lists them, now including every code the 3 calls andinventory_mode:can send (SEASON_BLOCK_API_BUSINESS_ERRORSin the app repo).Docs: a "Season seats" section at the end of the README's "Fixed Renewable Seasons": opt in with
inventory_mode:, set the seats aside, follow the job, read the block, release to single sale (now or at a set time), the two webhook names, the 202 guard, refusals throughSeatLayer::APIErrorwithcode, and partner seats staying out of the block.CHANGELOG: the "Next: 0.9.0" section. The version PR joins it with the season-2a section under
## 0.9.0.Files changed
CHANGELOG.md,README.md,lib/seatlayer/inventory.rb,lib/seatlayer/seasons.rb,spec/client_spec.rb,spec/seasons_spec.rb(6 files, +260 −19).Checks
bundle exec rubocop,bundle exec rspec) on Ruby 4.0 locally (CI runs 3.0, 3.2 and 3.4), re-run 10 Nov on this commit: rubocop clean (23 files); rspec 91/91.ConflictErrorwith itscode.inventory_mode:on create and update.ruby -c), and the calls by hand against the signatures inseasons.rb.season-phase4-ruby-compat.rbin the app session's notes; nothing is sent.gem fetch seatlayer -v 0.8.0, re-run 10 Nov)create_season_amendment, a Season answer carryinginventoryMode, and409 season_block_packagesonupdate_season. The other 10 are n/a: 0.8.0 has neither the season-2a calls nor theseseason-2a-serverhead5ef5dc4inventoryModeand409 season_block_packageslib/), including the 3 new calls and409 season_block_not_enabledRelease steps for the owner
main, with no tag.mainand retarget it tomain; the gate green; merge.main'slib/: both all PASS;completed, read, release withat:, read the release job.SeatLayer::VERSION = "0.9.0"inlib/seatlayer/version.rb, and join the CHANGELOG's season-2a section ("Unreleased") and "Next: 0.9.0" under a dated## 0.9.0. Merge tomain.git tag v0.9.0 && git push origin v0.9.0.release.ymlpublishes to RubyGems (MFA is required, which is why releases go through the workflow), and refuses if the tag andVERSIONdisagree.https://rubygems.org/api/v1/versions/seatlayer/latest.jsonreads0.9.0;gem install seatlayer -v 0.9.0, thenruby -e 'require "seatlayer"; puts SeatLayer::VERSION';gem yank seatlayer -v 0.9.0, which needs the owner's MFA. Installs fall back to 0.8.0; a fix ships as 0.9.1. A rollback also withdraws season-2a: both ship in 0.9.0.Failure modes
inventory_mode:would be ignored. Step 5 waits for production.date_leave_pending?: it would read the 202 body as the amendment. The README and the method comments point at the guard.ArgumentErroruntil it is added.inventoryMode(compat matrix). It can't call the 3 new routes, and it refuses the two new webhook names.Open risks
/server-api/seasons/#season-seats), which goes live with paiteq/seatmap #2063. Until then the link lands on the top of the Seasons page.